package vectordb;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 向量数据库接口
 */
public interface VectorDB {
    /**
     * 初始化向量数据库
     * 
     * @return 完成后的 Future
     */
    CompletableFuture<Void> init();

    /**
     * 创建集合
     * 
     * @param collectionName 集合名称
     * @param dimension 向量维度
     * @param metadataFields 元数据字段
     * @return 完成后的 Future
     */
    CompletableFuture<Void> createCollection(String collectionName, int dimension, Map<String, String> metadataFields);

    /**
     * 检查集合是否存在
     * 
     * @param collectionName 集合名称
     * @return 是否存在的 Future
     */
    CompletableFuture<Boolean> hasCollection(String collectionName);

    /**
     * 删除集合
     * 
     * @param collectionName 集合名称
     * @return 完成后的 Future
     */
    CompletableFuture<Void> dropCollection(String collectionName);

    /**
     * 插入文档
     * 
     * @param collectionName 集合名称
     * @param documents 文档列表
     * @return 完成后的 Future
     */
    CompletableFuture<Void> insert(String collectionName, List<VectorDocument> documents);

    /**
     * 搜索相似文档
     * 
     * @param collectionName 集合名称
     * @param queryVector 查询向量
     * @param limit 结果数量限制
     * @param filter 过滤条件
     * @return 搜索结果列表的 Future
     */
    CompletableFuture<List<VectorSearchResult>> search(String collectionName, double[] queryVector, int limit, String filter);

    /**
     * 搜索相似文档
     * 
     * @param collectionName 集合名称
     * @param queryVector 查询向量
     * @param limit 结果数量限制
     * @return 搜索结果列表的 Future
     */
    default CompletableFuture<List<VectorSearchResult>> search(String collectionName, double[] queryVector, int limit) {
        return search(collectionName, queryVector, limit, null);
    }

    /**
     * 获取文档数量
     * 
     * @param collectionName 集合名称
     * @return 文档数量的 Future
     */
    CompletableFuture<Long> count(String collectionName);

    /**
     * 删除文档
     * 
     * @param collectionName 集合名称
     * @param ids 文档ID列表
     * @return 完成后的 Future
     */
    CompletableFuture<Void> delete(String collectionName, List<String> ids);

    /**
     * 关闭连接
     * 
     * @return 完成后的 Future
     */
    CompletableFuture<Void> close();
}